[PM-43083][PM-43122] Show header breadcrumbs and identity tiles for every vault scope - #23021
[PM-43083][PM-43122] Show header breadcrumbs and identity tiles for every vault scope#23021gbubemismith wants to merge 1 commit into
Conversation
…for every vault scope Give the scoped vault header the right identity on every destination, across web and desktop: a title with an icon tile for All items / My vault, and a breadcrumb trail for organization vaults (All vault items, My items, shared folders). Fixes the blank "My items" header under the organization data-ownership policy (PM-43083, web) and the desktop screens that errantly titled themselves "Vault" instead of their scope (PM-43122). The scope-to-title and scope-to-tile logic is shared through libs/vault (vaultScopeTitle, vaultScopeHeaderTile) so both clients derive the header the same way. bit-header gains a title-icon slot to host the tile in its heading.
🤖 Bitwarden Claude Code ReviewOverall Assessment: REQUEST CHANGES Reviewed the scoped vault header work across web, desktop, and the shared component library: the Code Review Details
|
| @@ -0,0 +1,21 @@ | |||
| <bit-breadcrumbs> | |||
| <bit-breadcrumb [route]="orgRootCrumbRoute()"> | |||
There was a problem hiding this comment.
Details and fix
orgRootCrumbRoute() is undefined when collectionId() is null, which is exactly the All vault items page — a page that previously showed no breadcrumbs at all, so this is new behavior.
bit-breadcrumbs renders a crumb three ways (breadcrumbs.component.html:11-48): active → <span>/<h1>, has a route → <a>, otherwise → <button type="button" (click)="breadcrumb.onClick($event)">. With no route and no (click) bound here, the organization name becomes a tab stop announced as "button", carrying the hover:!tw-text-fg-brand link affordance, that does nothing when activated. The same applies to its collapsed form in the overflow menu (breadcrumbs.component.html:118-122).
Rendering it as static text would fix both — for example a text/static mode on bit-breadcrumb that reuses the active-crumb <span> branch without aria-current, used when orgRootCrumbRoute() is unset.
(Restoring the route is not the fix — on a URL with no query params the org crumb would then also match router.isActive, and both it and the All vault items crumb would render as <h1 aria-current="page">.)
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## main #23021 +/- ##
==========================================
+ Coverage 55.57% 55.61% +0.03%
==========================================
Files 4412 4412
Lines 140969 141022 +53
Branches 22392 22401 +9
==========================================
+ Hits 78350 78424 +74
+ Misses 56918 56884 -34
- Partials 5701 5714 +13 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
There was a problem hiding this comment.
Looks good. Just a small comment.
I think Claude has a good point in breadcrumbs.html , we should avoid rendering non-interactive elements as buttons.
| * The icon tile for the "All items" destination, which spans every vault and so belongs to no one | ||
| * of them — the brand list tile the side nav and the page header share. A fixed triple, so a shared | ||
| * frozen value rather than a factory like {@link orgIconTile}. | ||
| */ |
There was a problem hiding this comment.
Not sure how helpful this comment is. I think it's pretty obvious what this is doing. It also mentions the consuming components which could change and cause misinformation.
🎟️ Tracking
📔 Objective
Gives the scoped vault header the right identity on every destination, across web and desktop:
Fixes:
📸 Screenshots
Web
Screen.Recording.2026-09-04.at.19.45.40.mov
Desktop
Screen.Recording.2026-09-04.at.19.47.04.mov